package com.hy.proxy.core.entity;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.hy.proxy.common.CipherUtils;
import lombok.Data;

import java.io.Serializable;

/**
 * @Author: hy
 * @Date: Created in 2019/9/26/13:03
 * @Description:
 * @Version: 1.0
 */
@Data
public class SSR extends Proxy implements Serializable {
    /**
     * 入库时间
     */
    @Expose
    @SerializedName("adddate")
    private String addDate;
    /**
     * 国家
     */
    @Expose
    private String country;
    /**
     * 更新时间
     */
    @Expose
    private String data;
    /**
     * （未知作用）
     */
    @Expose
    @SerializedName("errorcount")
    private String errorCount;
    /**
     * 群组名
     */
    @Expose
    private String group = "IrisHhhhhhhy";

    /**
     * 备注
     */
    @Expose
    private String remarks;

    /**
     * ID （uuid？）
     */
    @Expose
    private String id;
    /**
     * 国区延时 （此属性是测试属性，应该还未完成开发）
     */
    @Expose
    private int mStationCnMs;
    /**
     * 是否被墙（GFW）
     */
    @Expose
    @SerializedName("m_station_cn_status")
    private String mStationCnStatus;
    /**
     * 加密方式
     */
    @Expose
    private String method;
    /**
     * 延时
     */
    @Expose
    private int ms;
    /**
     * 是否可用
     */
    @Expose
    private boolean status;
    /**
     * 混淆
     */
    @Expose
    private String obfs;
    /**
     * 混淆参数
     */
    @Expose
    @SerializedName("obfsparam")
    private String obfsParam;
    /**
     * 密码
     */
    @Expose
    private String password;
    /**
     * 协议
     */
    @Expose
    private String protocol;
    /**
     * 协议参数
     */
    @Expose
    @SerializedName("protocolparam")
    private String protocolParam;

    /**
     * 服务器地址
     */
    @Expose
    private String server;
    /**
     * 端口
     */
    @Expose
    @SerializedName("server_port")
    private int serverPort;
    /**
     * ss链接
     */
    @Expose
    @SerializedName("sslink")
    private String ssLink;
    /**
     * ssr链接
     */
    @Expose
    @SerializedName("ssrlink")
    private String ssrLink;

    public String getSsLink() {

        if (ssLink == null || "".equals(ssLink.trim())) {
            StringBuilder sb = new StringBuilder();
            sb.append(method);
            sb.append(":");
            sb.append(password);
            sb.append("@");
            sb.append(server);
            sb.append(":");
            sb.append(serverPort);

            return "ss://" + CipherUtils.BASE64.encoder(sb.toString());
        }

        return ssLink;
    }


    public String getSsrLink() {

        if (ssrLink == null || "".equals(ssrLink.trim())) {

            StringBuilder sb = new StringBuilder();
            sb.append(server);
            sb.append(":");
            sb.append(serverPort);
            sb.append(":");
            sb.append(protocol);
            sb.append(":");
            sb.append(method);
            sb.append(":");
            sb.append(obfs);
            sb.append(":");
            sb.append(CipherUtils.BASE64.encoder(password));
            sb.append("/?");

            if (obfsParam != null || "".equals(obfsParam.trim())) {
                sb.append("obfsParam");
                sb.append("=");
                sb.append(CipherUtils.BASE64.encoder(obfsParam));
                sb.append("&");
            }

            if (protocolParam != null || "".equals(protocolParam.trim())) {
                sb.append("protocolParam");
                sb.append("=");
                sb.append(CipherUtils.BASE64.encoder(protocolParam));
                sb.append("&");
            }

            if (remarks != null || "".equals(remarks.trim())) {
                sb.append("remarks");
                sb.append("=");
                sb.append(CipherUtils.BASE64.encoder(remarks));
                sb.append("&");
            }

            if (group != null || "".equals(group.trim())) {
                sb.append("group");
                sb.append("=");
                sb.append(CipherUtils.BASE64.encoder(group));
            }

            return "ssr://" + CipherUtils.BASE64.encoder(sb.toString().toLowerCase());
        }

        return ssrLink;
    }
}
